local hgps = {}

local gps_uart_id = 2
local loc_data={
    lat = 0.0,
    lng = 0.0,
}

local function getLocCb(result, lat, lng, addr, time, locType)
    -- 获取经纬度成功, 坐标系WGS84
    if result == 0 then
        if lat and lng then
            loc_data.lat = tonumber(lat)
            loc_data.lng = tonumber(lng)
            -- 转换单位
            -- local lat_dd,lat_mm = math.modf(loc_data.lat)
            -- local lng_dd,lng_mm = math.modf(loc_data.lng)
            -- loc_data.lat = lat_dd * 100 + lat_mm * 60
            -- loc_data.lng = lng_dd * 100 + lng_mm * 60
        end
        log.info("hgps","服务器返回的时间", time:toHex())
        log.info("hgps","定位类型,基站定位成功返回0", locType)
    end
end

local function hgps_agps()
    -- 首先, 发起位置查询
    loc_data.lat, loc_data.lng = 0.0, 0.0
    if mobile then
        mobile.reqCellInfo(6)
        sys.waitUntil("CELL_INFO_UPDATE", 6000)
        lbsLoc.request(getLocCb)
    end
    -- if loc_data.lat == 0.0 then
    --     -- 获取最后的本地位置
    --     local locStr = io.readFile("/hxxtloc")
    --     if locStr then
    --         local jdata = json.decode(locStr)
    --         if jdata and jdata.lat then
    --             loc_data.lat = jdata.lat
    --             loc_data.lng = jdata.lng
    --         end
    --     end
    -- end
end

local function hgps_update_loc()
    local lat, lng=0.0, 0.0
    
    if exgnss.is_fix() then
        log.info("hgps", "北斗定位")
        h485.Sensor_val.gps_flag = 1
        local rmc = exgnss.rmc(2)
        if rmc.valid then
            lat, lng = rmc.lat, rmc.lng
        end
    else
        log.info("hgps", "基站定位")
        h485.Sensor_val.gps_flag = 0
        local is_ready,_ = socket.adapter(socket.LWIP_GP)
        if is_ready then
            hgps_agps()
            lng = loc_data.lng or 0.0
            lat = loc_data.lat or 0.0
        end
    end
    if lat~=0.0 and lng~=0.0 then
        h485.Sensor_val.latitude = lat
        h485.Sensor_val.longitude = lng
        -- log.info("待保存的GPS位置", lat, lng)
        -- local locStr = string.format('{"lat":%7f,"lng":%7f}', lat, lng)
        -- log.info("hgps", "保存GPS位置", locStr)
        -- io.writeFile("/hxxtloc", locStr)
    end
end

local gnssotps={
    gnssmode=1, --1为卫星全定位，2为单北斗
    agps_enable=false,    --是否使用AGPS，开启AGPS后定位速度更快，会访问服务器下载星历，星历时效性为北斗1小时，GPS4小时，默认下载星历的时间为1小时，即一小时内只会下载一次
    -- debug=true,    --是否输出调试信息
    -- uart=2,    --使用的串口,780EGH和8000默认串口2
    -- uartbaud=115200,    --串口波特率，780EGH和8000默认115200
    -- bind=1, --绑定uart端口进行GNSS数据读取，是否设置串口转发，指定串口号
    -- rtc=false    --定位成功后自动设置RTC true开启，flase关闭
    ----因为GNSS使用辅助定位的逻辑，是模块下载星历文件，然后把数据发送给GNSS芯片，
    ----芯片解析星历文件需要10-30s，默认GNSS会开启20s，该逻辑如果不执行，会导致下一次GNSS开启定位是冷启动，
    ----定位速度慢，大概35S左右，所以默认开启，如果可以接受下一次定位是冷启动，可以把auto_open设置成false
    ----需要注意的是热启动在定位成功之后，需要再开启3s左右才能保证本次的星历获取完成，如果对定位速度有要求，建议这么处理
    -- auto_open=false 
}
local function mode2_cb(tag)
    log.info("TAGmode2_cb+++++++++",tag)
    log.info("nmea", "rmc", json.encode(exgnss.rmc(2)))
end

function hgps.gps_init()
    -- exgnss.setup(gnssotps)
    -- exgnss.open(exgnss.DEFAULT,{tag="modeDefault"}) --使用DEFAULT模式，开启后一直运行  
end

--GNSS定位状态的消息处理函数：
local function gnss_state(event, ticks)
    -- event取值有
    -- "FIXED"：string类型 定位成功
    -- "LOSE"： string类型 定位丢失
    -- "CLOSE": string类型 GNSS关闭，仅配合使用exgnss.lua有效
    -- ticks number类型 是事件发生的时间,一般可以忽略
    log.info("hgps", "state", event)
    if event=="FIXED" then
        --获取rmc数据
        --json.encode默认输出"7f"格式保留7位小数，可以根据自己需要的格式调整小数位，本示例保留5位小数
        log.info("hgps", "rmc2", json.encode(exgnss.rmc(2)))
        -- hgps_update_loc()
    end
end

-- sys.subscribe("GNSS_STATE",gnss_state)

-- sys.taskInit(function()
--     sys.wait(10000)
--     hgps.gps_init()
--     while true do
--         sys.wait(60000)
--         hgps_update_loc()
--     end
-- end)

return hgps
